#include <REGX52.H>
#include "OneWire.h"

//DS18B20指令
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD 	0xBE

/**
  * @brief  DS18B20开始温度变换
  * @param  无
  * @retval 无
  */
void DS18B20_ConvertT(void)//ConvertT，测温温度转换
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);					//发送跳过ROM的字节
	OneWire_SendByte(DS18B20_CONVERT_T);	 			//发送ConvertT，测温温度转换的字节
}


/**
  * @brief  DS18B20读取温度，
  * @param  无
  * @retval 温度数值，因为温度他的返回值是带小数的，所以用float
  */
float DS18B20_ReadT(void) 
{
	unsigned char TLSB,TMSB;
	int Tmp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);		
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);	 		//发送读暂存器的字节
	TLSB = OneWire_ReceiveByte();						//按顺序读字节，先读低位的字节
	TMSB = OneWire_ReceiveByte();						//读第二个温度高位的字节
	Tmp = (TMSB<<8) | TLSB;								//就是把16位的数据拿到，然后在强制转换为int，这个是有符号的int，因为51默认int是有符号的，所以tmp就是实际温度
	T = Tmp/16.0;										//Tmp里面就是温度数据，因为int没有小数位，要用float表示，所以 /16，就是，把后4位的数字除 成为小数位
	return T;
}
	
